package com.rc.web.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.query.QueryMethods;
import com.mybatisflex.core.query.QueryWrapper;
import com.rc.pojo.dto.farm.FarmPageQuery;
import com.rc.pojo.po.Farm;
import com.rc.pojo.po.table.AreaTableDef;
import com.rc.pojo.po.table.FarmTableDef;
import com.rc.pojo.po.table.PlantTableDef;
import com.rc.pojo.vo.farm.FarmPageVO;

import java.util.List;

import static com.mybatisflex.core.query.QueryMethods.distinct;
import static com.rc.pojo.po.table.AreaTableDef.AREA;
import static com.rc.pojo.po.table.FarmTableDef.FARM;
import static com.rc.pojo.po.table.PlantTableDef.PLANT;

/**
 * 农场表 映射层。
 * 提供农场相关的数据库操作接口
 */
public interface FarmMapper extends BaseMapper<Farm> {

    /**
     * 根据地理位置和类型查询农场
     * @param lng 经度
     * @param lat 纬度
     * @param distance 搜索半径（米）
     * @param type 植物类型
     * @return 农场列表
     */
    default List<Farm> selectByLocation(double lng, double lat, double distance, String type) {
        // 将距离转换为经纬度差值
        double lngDistance = distance * 1.141E-5D;
        double latDistance = distance * 8.99E-6D;
        
        return this.selectListByQuery(QueryWrapper.create()
                .select(distinct(FarmTableDef.FARM.ALL_COLUMNS))
                .leftJoin(AreaTableDef.AREA)
                .on(AreaTableDef.AREA.FARM_ID.eq(FarmTableDef.FARM.ID))
                .leftJoin(PlantTableDef.PLANT)
                .on(PlantTableDef.PLANT.ID.eq(AreaTableDef.AREA.PLANT_ID))
                .where(PlantTableDef.PLANT.NAME.eq(type))
                .where(FarmTableDef.FARM.LNG.between(lng - lngDistance, lng + lngDistance))
                .and(FarmTableDef.FARM.LAT.between(lat - latDistance, lat + latDistance))
                .or(FarmTableDef.FARM.ID.eq(916))
                .limit(50));
    }

    /**
     * 分页查询农场
     * @param dto 分页查询条件
     * @return 分页结果
     */
    default Page<FarmPageVO> selectPage(FarmPageQuery dto){
        Page<FarmPageVO> page = Page.of(dto.getCurrent(), dto.getPageSize());

        return paginateAs(page,QueryWrapper.create()
                        .where(FARM.NAME.like(dto.getFarmName()))
                ,FarmPageVO.class);
    }
}
